class Validators {
  // 邮箱验证
  static String? email(String? value) {
    if (value == null || value.trim().isEmpty) {
      return '请输入邮箱地址';
    }
    
    final emailRegex = RegExp(
      r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
    );
    
    if (!emailRegex.hasMatch(value.trim())) {
      return '请输入有效的邮箱地址';
    }
    
    return null;
  }

  // 用户名验证
  static String? username(String? value) {
    if (value == null || value.trim().isEmpty) {
      return '请输入用户名';
    }
    
    if (value.trim().length < 3) {
      return '用户名至少需要3个字符';
    }
    
    if (value.trim().length > 20) {
      return '用户名最多20个字符';
    }
    
    // 可以是邮箱格式或者普通用户名
    if (value.contains('@')) {
      return email(value);
    }
    
    final usernameRegex = RegExp(r'^[a-zA-Z0-9_\u4e00-\u9fa5]+$');
    if (!usernameRegex.hasMatch(value.trim())) {
      return '用户名只能包含字母、数字、下划线和中文';
    }
    
    return null;
  }

  // 密码验证
  static String? password(String? value) {
    if (value == null || value.isEmpty) {
      return '请输入密码';
    }
    
    if (value.length < 6) {
      return '密码至少需要6个字符';
    }
    
    if (value.length > 20) {
      return '密码最多20个字符';
    }
    
    return null;
  }

  // 确认密码验证
  static String? confirmPassword(String? value, String? originalPassword) {
    final passwordError = password(value);
    if (passwordError != null) {
      return passwordError;
    }
    
    if (value != originalPassword) {
      return '两次输入的密码不一致';
    }
    
    return null;
  }

  // 显示名称验证
  static String? displayName(String? value) {
    if (value == null || value.trim().isEmpty) {
      return null; // 显示名称可以为空
    }
    
    if (value.trim().length > 20) {
      return '显示名称最多20个字符';
    }
    
    return null;
  }

  // 伴侣名称验证
  static String? partnerName(String? value) {
    if (value == null || value.trim().isEmpty) {
      return null; // 伴侣名称可以为空
    }
    
    if (value.trim().length > 20) {
      return '伴侣名称最多20个字符';
    }
    
    return null;
  }

  // 必填字段验证
  static String? required(String? value, String fieldName) {
    if (value == null || value.trim().isEmpty) {
      return '请输入$fieldName';
    }
    return null;
  }

  // 手机号验证
  static String? phone(String? value) {
    if (value == null || value.trim().isEmpty) {
      return '请输入手机号';
    }
    
    final phoneRegex = RegExp(r'^1[3-9]\d{9}$');
    if (!phoneRegex.hasMatch(value.trim())) {
      return '请输入有效的手机号';
    }
    
    return null;
  }

  // 验证码验证
  static String? verificationCode(String? value) {
    if (value == null || value.trim().isEmpty) {
      return '请输入验证码';
    }
    
    if (value.trim().length != 6) {
      return '验证码应为6位数字';
    }
    
    final codeRegex = RegExp(r'^\d{6}$');
    if (!codeRegex.hasMatch(value.trim())) {
      return '验证码应为6位数字';
    }
    
    return null;
  }

  // 组合验证器
  static String? Function(String?) combine(List<String? Function(String?)> validators) {
    return (String? value) {
      for (final validator in validators) {
        final error = validator(value);
        if (error != null) {
          return error;
        }
      }
      return null;
    };
  }
}